10. 中间变量

中间变量

在 Andy 的代码中,你会注意到,他有时候会使用中间变量。中间变量可以看作冗余代码。

例如:

float x = 5.8;
float y = 7.1;

float area = x * y;
float reciprocal_area = 1/(area);

如果你只需要计算倒数,可以这么写:

float x = 5.8;
float y = 7.1;
float reciprocal_area = 1/(x*y);

基本的变量类型,如单精度浮点数、整数和字符,相对高效。因此,这两个版本的代码运行起来基本感觉不到差别。实际上,编译器可能已经消除了第一个和第二个版本中低效率的地方。

那么,为什么还要讨论中间变量呢?

中间矩阵变量

在 Andy 的代码中,有一个地方,他使用了二维向量,而不是中间变量。这个地方没有上面的例子那么明显。但如果你发现了,删除额外变量后,代码运行速度肯定会更快。

本课刚开始提到过,向量很方便,但效率方面没有优势。编译器会为一个新向量分配一定的内存量,然后再多加几个字节,作为缓冲。缓冲部分能够多保存几个元素,方便你在向量末端添加新元素。

但是,当向量超出了分配大小后,整个向量就会被复制到 RAM 中的另一个地方。这非常低效!

因此,如果你已经有一个动态改变容量的向量容器,请避免复制向量!

练习

在接下来的练习中,你会看到,创建新向量是多么低效。这段代码遍历了一个二维向量,将每个元素除以了一个常数。但是,它没有直接遍历向量,而是创建了一个新的二维向量,这毫无必要。